<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Array</title>
    <script>
      /*
        Array是JS内置对象之一,它是数组对象,用来提供各种数组操作的相关属性和函数
      */
      //属性
      //length,获取数组长度(数组元素个数)
      let arr = [3, 2, 1, 7, 6, 5, 4]
      console.log(arr.length)

      //常用函数(功能)
      //1.(一般)at(), 根据下标获取数组元素
      //注意: 参数可以是负数,表示从后往前获取元素
      console.log(arr.at(-3))

      //2.(一般)concat(),连接任意多个数组,产生一个新数组
      let arr2 = [1, 2, 3]
      let arr3 = [4, 5, 6]
      let arr4 = [7, 8, 9]
      let result = arr2.concat(arr3, arr4)
      console.log(result)

      //3.(重点)every(),判断数组内的所有元素是否都符合指定的条件函数,它返回一个布尔值
      let scores = [78, 56, 98, 55, 86, 65, 98]
      //ES5版本
      /* result = scores.every(function (score) {
        return score > 60
      }) */

      //ES678版本
      result = scores.every(score => score > 60)

      //4.(重点)some(),判断数组中是否有元素符合条件,如果有返回true,反之返回false
      result = scores.some(score => score > 60)

      //5.(重点)filter(),过滤数组元素,把符合条件的元素放入到一个新数组中
      result = scores.filter(score => score > 60)

      //6.(重点)find(),findIndex(),findLast(),findLastIndex()
      //获取数组中第一个或者最后一个符合条件的元素或者下标
      //result = scores.find(score => score > 60)
      //result = scores.findIndex(score => score > 60)
      //result = scores.findLast(score => score > 60)
      result = scores.findLastIndex(score => score > 60)
      console.log(result)

      //7.(重点)forEach(),数组迭代
      scores.forEach(score => console.log(score))

      //8.(重点)from(),把类似数组的数据转换成真正的数组
      //注意: 后面学习中我们会碰到很多类数组的对象结构,具有一定的数组特性,但是又不是完全的数组,所以可以使用from()函数来转换成真正的数组从而方便操作
      //注意: 把字符串转换数组的一种方式
      console.log(Array.from('abcde'))

      //9.(重点)includes(),判断数组中是否包含指定元素
      console.log(scores.includes(98))

      //10.(重点)indexOf(),lastIndexOf(),判断指定元素在数组中首次或者最后一次出现的下标
      //注意: 如果不存在,则返回-1
      console.log(scores.indexOf(98))
      console.log(scores.lastIndexOf(98))
      console.log(scores.indexOf(100))

      //11.(重点)isArray(),判断是否为数组
      console.log(Array.isArray(scores))

      //12.(重点)join(),使用连接符把数组元素连接成字符串
      //注意:空参数表示使用,来连接数组元素变成字符串,也可以传入连接符
      console.log(scores.join())
      console.log(scores.join(''))
      console.log(scores.join('-'))

      //13.(一般)of(),创建数组
      let arr5 = Array.of(1, 2, 3, 4, 5, 6)
      console.log(arr5)

      //14.(一般)reverse(),反转数组元素
      //注意: 此函数是直接操作原数组,原数组的排列顺序将被倒转
      let colors = ['red', 'green', 'blue', 'yellow']
      colors.reverse()
      console.log(colors)

      //15.(重点)sort(),数组元素排序
      //注意:默认情况下以升序排列数组元素,并且直接排序的是原数组元素
      //升序
      //arr.sort()

      //降序
      arr.sort((a, b) => a < b)
      console.log(arr)

      //16.(一般)reduce(),数组元素计算
      console.log(arr.reduce((a, b) => a + b))

      //17.(一般)slice(),根据起止下标截取数组指定区间的元素
      //注意: 下标范围是前闭后开区间,即开始时包含的,结束下标元素不包含
      //注意: 结束下标可以省略,如果省略,则表示截去到数组末尾
      let animals = ['ant', 'bison', 'camel', 'duck', 'elephant']
      console.log(animals.slice(2, 4))
    </script>
  </head>
  <body></body>
</html>
